public class code1 {
    // LeetCode TOP 150 接雨水问题

    public int trap(int[] height) {
        // 这个问题先使用 双指针 来解决
        // 先来排除一下 空数组 的情况
        if(height.length == 0) {
            return 0;
        }
        // 创建左右双指针
        int left = 0;
        int right = height.length - 1;

        // 这里要得知当前位置是否能够接到雨水，是需要知道当前位置的左右位置的情况
        // 这里需要创建出两个元素分别记录左右位置的最大值
        // 这样就可以通过当前指针指向的值和指针后面的值进行比较，以此来获取到最大值了。
        int maxL = 0;
        int maxR = 0;

        // 定义一个记录雨水数量的变量
        int num = 0;

        // 在两指针交汇之前，不断循环记录可接雨水的数量
        while(left < right) {
            // 每次循环都都需要 更新 最大值
            maxL = Math.max(maxL, height[left]);
            maxR = Math.max(maxR, height[right]);

            if(maxR > maxL) {
                // 当 左侧的最大值大于右侧时，记录左侧这边的 雨水格
                // 需要知道的值，这里的 left 指针是先使用在 --
                num += maxL - height[left++];
            } else {
                // 这里处理的是 当左侧大于或者等于的情况
                // 与上面是同理的，因为每次记录的都是最大值，即使出现了两个相邻位置增加的情况
                // 也会出现最大值(自身) 和当前位置指向的自身元素进行相减操作，得到的值为 0
                // 当记录下的最大值在此之后都没有更大的值，则会通过相减的形式记录下可接到的雨水的量
                // 也因为有 maxR > maxL 的判断条件
                // 因为只要那一边大就去控制处理另一方，就不会出现 没有按短板为界限接雨水的问题
                num += maxR - height[right--];
            }
        }
        return num;
    }
}
